home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 2: CDPD 1 / Almathera Ten on Ten - Disc 2: CDPD 1.iso / pd / 401-425 / 408 / kickdate / kickdate.c < prev    next >
C/C++ Source or Header  |  1995-03-14  |  4KB  |  178 lines

  1. /* KICKDATE - Copyright 1990 Joe Porkka
  2.         FREELY DISTRIBUTABLE
  3.  
  4.     Purpose: Keeps the current date on the Kickstart disk
  5.          for A1000 owners with autoboot harddrives.
  6.  
  7. Version 1.0
  8.  
  9. */
  10.  
  11.  
  12. #include <exec/types.h>
  13. #include <exec/io.h>
  14. #include <devices/trackdisk.h>
  15. #include <exec/memory.h>
  16.  
  17. char *buffer;
  18.  
  19. struct IOStdReq *diskreq, *CreateStdIO();
  20. struct    MsgPort *rport=0,*CreatePort();
  21. int dev=0, ioreqs=0, ports=0;
  22. int limit;
  23. int outcount=0;
  24.  
  25. DeleteStdIO(req) struct IOStdReq *req;
  26. {
  27.     if(req==0) {
  28.     /* printf("Delete a null message-ignored\n"); */
  29.     } else {
  30.     req->io_Message.mn_Node.ln_Type=0xff;
  31.     req->io_Device=(struct Device *)-1;
  32.     req->io_Unit=(struct Unit *)-1;
  33.     /* printf("Freeing a stdio\n"); */
  34.     FreeMem(req,sizeof(struct IOStdReq));
  35.     }
  36. }
  37.  
  38. void
  39. main(av,ac)
  40.     int av;
  41.     char **ac;
  42. {
  43.  
  44.     int status;
  45.     int fetchtime=0;
  46.     if(av!=2) {
  47.     printf("Usage: kickdate set | get | getset\n");
  48.     printf("       set -> write date to disk. get -> get date from disk\n");
  49.     printf("       getset -> get, then periodically write date\n");
  50.     return;
  51.     }
  52.     if( stricmp(ac[1],"set")==0 ) fetchtime=0;
  53.     if( stricmp(ac[1],"get")==0 ) fetchtime = 1;
  54.     if( stricmp(ac[1],"getset")==0 ) fetchtime = 2;
  55.     buffer=0;
  56.     rport=CreatePort("disk.port",0);
  57.     if(rport==0) {
  58.     printf("port open failed\n");
  59.     goto portfail;
  60.     }
  61.     ports=1;
  62.     /* printf("GEE!\n"); */
  63.     diskreq=CreateStdIO(rport);
  64.     if(diskreq==0) {
  65.     printf("CreateStdIO failed\n");
  66.     goto iofail;
  67.     }
  68.     ioreqs=1;
  69.     /* printf("Attempt OpenDevice\n"); */
  70.     status=OpenDevice("trackdisk.device",0,diskreq,0);
  71.     if(status!=0) {
  72.     printf("Opendevice failed\n");
  73.     goto iofail;
  74.     }
  75.     dev=1;
  76.  
  77.     buffer = (char *)AllocMem(512, MEMF_CHIP);
  78.     if(buffer==0) goto memfail;
  79.     getsector(0,0,0);
  80.     if(!(diskreq->io_Error || diskreq->io_Actual!=512)) {
  81.     if( ((long *)buffer)[0]=='KICK') {
  82.         if(fetchtime) {
  83.         SetNewTime( ((long *)buffer)[1]);
  84.         } else {
  85.         ((long*)buffer)[1]=GetSysTime();
  86.         writesector(0,0,0);
  87.         if(diskreq->io_Error || diskreq->io_Actual!=512) {
  88.             fetchtime=0;
  89.         }
  90.         }
  91.     }
  92.     if(fetchtime==2) {  /* Stay resident */
  93.         while(1) {
  94.         Delay(5*60*50); /* Sleep for 5 minutes */
  95.         /* printf("Done sleep %ld\n", SetSignal(0,0)); */
  96.         if(SetSignal(0,0)&(1<<12)) break;  /* CTRL_C */
  97.         getsector(0,0,0);
  98.         /* printf("Got it!\n"); */
  99.         if(!(diskreq->io_Error || diskreq->io_Actual!=512)) {
  100.             if( ((long *)buffer)[0]=='KICK') {
  101.             ((long*)buffer)[1]=GetSysTime();
  102.             writesector(0,0,0);
  103.             /* printf("Wrote it!\n"); */
  104.             if(diskreq->io_Error || diskreq->io_Actual!=512) {
  105.                 /* break; */
  106.             }
  107.             MotorOff();
  108.             }
  109.             MotorOff();
  110.         } else break;
  111.         }
  112.     }
  113.     }
  114.  
  115.  
  116.     MotorOff();
  117.  
  118.  
  119. memfail:
  120.     if(buffer) FreeMem(buffer, 512);
  121.     CloseDevice(diskreq);
  122. iofail:
  123.     DeleteStdIO(diskreq);
  124. portfail:
  125.     if(rport) {
  126.     RemPort(rport);
  127.     FreeMem(rport,sizeof(*rport));
  128.     }
  129. }
  130.  
  131. CXBRK() {
  132.     MotorOff();
  133.  
  134.     if(dev) {CloseDevice(diskreq);}
  135.     if(ioreqs) {
  136.     DeleteStdIO(diskreq);
  137.     }
  138.     if(ports) {
  139.     if(rport) {
  140.         RemPort(rport);
  141.         FreeMem(rport,sizeof(*rport));
  142.     }
  143.     }
  144.     exit(0);
  145. }
  146.  
  147. getsector(cyl,sec,head)
  148.     int cyl,sec,head;
  149. {
  150.     diskreq->io_Offset = TD_SECTOR * (sec+NUMSECS*head+NUMSECS*2*cyl);
  151.     diskreq->io_Length=TD_SECTOR;
  152.     diskreq->io_Data=(APTR)buffer;
  153.     diskreq->io_Command=CMD_READ;
  154.     diskreq->io_Flags=0;
  155.     DoIO(diskreq);
  156. }
  157.  
  158. writesector(cyl,sec,head)
  159.     int cyl,sec,head;
  160. {
  161.     diskreq->io_Offset = TD_SECTOR * (sec+NUMSECS*head+NUMSECS*2*cyl);
  162.     diskreq->io_Length=TD_SECTOR;
  163.     diskreq->io_Data=(APTR)buffer;
  164.     diskreq->io_Command=CMD_WRITE;
  165.     diskreq->io_Flags=0;
  166.     DoIO(diskreq);
  167.     diskreq->io_Command=CMD_UPDATE;
  168.     diskreq->io_Flags=0;
  169.     DoIO(diskreq);
  170. }
  171.  
  172. MotorOff()
  173. {
  174.     diskreq->io_Command=TD_MOTOR;
  175.     diskreq->io_Length=0;
  176.     DoIO(diskreq);
  177. }
  178.